<?php 
class CallsController extends AppController {	
	
	var $name 		= 'Calls';
	var $helpers 	= array('Html'); //TODO - helpers are in app_controller, not needed here
	var $uses 		= array(
		'Call', 'Agency'
	);
  var $paginate = array(
      'conditions' => array('Call.is_deleted LIKE' => '0'),
      'limit' => 10,
      'order' => array(
          'Call.name' => 'asc'
      ),
      'contain' => array('Call', 'Agency')
  );

	
	function beforeFilter() {
	    parent::beforeFilter();
	    $this->set('title_for_layout', 'Výzvy');
	    $this->Auth->allow('index', 'search', 'detail');
		$this->Auth->authorize = 'actions';
	    if ($this->Session->read('Auth.User'))
			$this->Auth->allow('*');
		
		//ak ideme na inu akciu, ako search, zmazeme ulozene search data
       if($this->request->params['action'] != 'search') {
         $this->Session->delete('Search'); 
       }
	    
	}
	
	/**
	 * Listovanie výziev
	 * 
	 * Za pomoci componentu „Pagination“ získa metóda príslušný počet záznamov typu „Call“ a pošle ich do view.
	 * 
	 */
	function index() {
    	if ($this->Cookie->read('limit'))
			$this->paginate['limit'] = $this->Cookie->read('limit');
		$this->Call->recursive = 2;
    	$calls = $this->paginate();
		$this->set('calls', $calls);
	}
	
	/*
	function admin_index() {
	  $this->Call->recursive = 2;
    $calls = $this->paginate();
		$this->set('calls', $calls);
	}
	*/
	
	/**
	 * Vyhľadávanie  výziev
	 * 
	 * Ak nie sú poslané žiadne kritéria vyhľadávania, metóda sa správa rovnako, ako metóda „index“. 
	 * Ak sú poslané kritéria vyhľadávania, tak metóda podľa nich za pomoci componentu 
	 * „Pagination“ získa príslušný počet záznamov typu „Call“ a pošle ich do view.
	 * 
	 */
	function search() {
		// ziskanie zaznamov
	    $conditions = array();
	    
	    // ak boli poslane post data, vyhladavame podla nich
	    if (!empty($this->request->data)) {
	      $search = $this->request->data;
	      // search data zapiseme do session, aby sme podla nich mohli hladat aj pri listingu
	      // search data sa vymazu, ked prejdeme na inu akciu (toto sa robi vo funkcii beforFilter)
	      $this->Session->write('Search', $search);  
	    }
	    // ak nie su poslane post data, skusime ako search data pouzit data zo session
	    elseif ($this->Session->check('Search')) {
	      $search = $this->Session->read('Search');
	    }
	    else { 
	      $search = array();
	    }
	    
	    // tato funkcia vypise vsetky post data, ktore boli poslane, staci odkomentovat a je vidiet, co prislo
	    // debug($this->request->data);
	    
	    // na zaklade checkboxov pridavame podmienky
	    // podrobne popisane v http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions
	    // je tu pouzity OR a LIKE
	    if (!empty($search)) {
	      if ($search['callName']) $conditions['OR'][] = array('Call.name LIKE' => '%'.$search['search'].'%');
	      if ($search['description']) $conditions['OR'][] = array('Call.description LIKE' => '%'.$search['search'].'%');
	      if ($search['agencyName']) {
	      		$conditions['OR'][] = array('Agency.name LIKE' => '%'.$search['search'].'%');
	      		$conditions['OR'][] = array('Agency.fullname LIKE' => '%'.$search['search'].'%');
	      }
	    }
	
	    // zavolame pagination s podmienkami
	    $this->paginate = array(
	          'limit' => 10,
	          'order' => array(
	              'Call.id' => 'asc'
	          ),
	          'conditions' => $conditions,
	    );
	    
	    
    	if ($this->Cookie->read('limit'))
			$this->paginate['limit'] = $this->Cookie->read('limit');
	    
	    // posleme data do view
	    $data = $this->paginate('Call');
	    $this->set('calls', $data);
	}
	
	/**
	 * Zobrazenie detailu výzvy
	 * 
	 * Ak nie je zadané id, metóda zavolá presmerovanie na metódu „index“. Ak je zadané id, 
	 * metóda sa pokúsi získať záznam projektu s príslušným id. 
	 * Ak záznam neexistuje, metóda zavolá presmerovanie na metódu „index“. 
	 * Ak záznam existuje, metóda ho pošle do view. 
	 * 
	 * @param int id
	 */
	function detail($id = null) {
		if ($id == NULL && empty($this->request->data)){ 
      $this->Session->setFlash('Invalid ID');
      $this->redirect(array('controller' => 'calls', 'action' => 'index'));
    }
    else{
      $call = $this->Call->find('first', array('conditions' => array('Call.id' => $id)));                    
      if ($call == null){
        $this->Session->setFlash('Pre hladane id neexistuje ziadny zaznam');
        $this->redirect(array('controller' => 'calls', 'action' => 'index')); 
      }
      $this->set('call', $call);
    }	
	}
	
	//ADMIN
	
	/**
	 * Listing výzviev
	 * 
	 * Za pomoci componentu „Pagination“ získa metóda príslušný počet záznamov typu „Call“ a pošle ich do view.
	 * 
	 */
	function admin_list() {
    	if ($this->Cookie->read('limit'))
			$this->paginate['limit'] = $this->Cookie->read('limit');
    	$this->Call->recursive = 2;
    	$calls = $this->paginate();
		$this->set('calls', $calls);
  }
	
	
	/**
	 * Pridanie výzvy
	 * 
	 * Ak nie sú poslané žiadne POST data, metóda nevykonáva žiadnu akciu a zobrazí sa pridávací formulár. 
	 * Ak sú poslané, metóda skontroluje, či sú dáta korektné. Táto kontrola zahŕňa aj kontrolu existencie katedry a osôb s menami, ktoré boli poslané. 
	 * Ak neexistujú, metóda pre ne vytvorí na základe týchto mien nový záznam. 
	 * Ak nie sú poslané údaje korektné, metóda o tom vygeneruje správu. 
	 * Ak áno, uloží poslané údaje do databázy a vygeneruje správu o úspešnom pridaní záznamu. 
	 * 
	 */
	function admin_add() {      
    //kontrola poslanych udajov
    if (!empty($this->request->data)) {
      //bezpecnostne pravidlo
      unset($this->request->data['Call']['id']);
      $this->request->data['Call']['is_deleted'] = 0;
      if ($this->Call->save($this->request->data)){
        $this->Session->setFlash(CALL_ADDED, 'default', array());
        $this->redirect(array('admin' => false, 'controller' => 'calls', 'action' => 'index'));
      }
      else
        $this->Session->setFlash(CALL_NOT_ADDED, 'default', array());
      
    }
    $agencies = $this->Agency->find('all', array('recursive' => -1));
    foreach ($agencies as $agency){
      $options[$agency['Agency']['id']] = $agency['Agency']['name'];
    }
    //debug($options);
    $this->set('options', $options);
	}
	
	/**
	 * Editovanie výzvy
	 * 
	 * Ak nie sú poslané žiadne POST data, ani id, metóda zavolá presmerovanie na metódu „admin_list“. 
	 * Ak je poslané iba id, metóda získa z databázy záznam typu „Call“ s príslušným id a odošle ho do view, ktorý zobrazí editovací formulár. 
	 * Ak záznam s príslušným id neexistuje, metóda vygeneruje správu a zavolá presmerovanie na metódu „admin_list“. 
	 * Ak sú poslané POST data, metóda skontroluje, či sú dáta korektné. Táto kontrola zahŕňa aj kontrolu existencie agentúry s menom, ktoré bolo poslané. 
	 * Ak neexistuje, metóda pre ňu vytvorí na základe tohto mena nový záznam. 
	 * Ak nie sú dáta korektné, metóda o tom vygeneruje správu. 
	 * Ak áno, uloží poslané údaje do databázy a vygeneruje správu o úspešnom uložení záznamu. 
	 * 
	 * 
	 * @param int $id
	 */
  function admin_edit($id = NULL) {        
    //skontroluje, ci je nastavene id, alebo su poslane postdata
    if ($id == NULL && !empty($this->request->data)) 
      $this->redirect(array('admin' => false, 'controller' => 'calls', 'action' => 'index'));
    
    //ulozi poslane data
    if ($this->request->is('post')) {
      if ($this->Call->Save($this->request->data)) {
        //pri uspesnom ulozeni nastavime hlasku o uspesnoti a presmerujeme na listing uzivatelov
        $this->Session->setFlash(CALL_EDITED);
        $this->redirect(array('admin' => false, 'controller' => 'calls', 'action' => 'index'));       
      } 
      else
        //pri neuspesnom ulozeni nastavime hlasku o neuspesnosti
        $this->Session->setFlash(CALL_NOT_EDITED);
    }
    else {
      $this->request->data = $this->Call->read(null, $id);
    }
    $agencies = $this->Agency->find('all', array('recursive' => -1));
    foreach ($agencies as $agency){
      $options[$agency['Agency']['id']] = $agency['Agency']['name'];
    }
    //debug($options);
    $this->set('options', $options);
  }
	
	/**
	 * Zmazanie výzvy
	 * 
	 * Ak nie je poslané id, metóda zavolá presmerovanie na metódu „admin_list“. Ak je poslané id, metóda uloží záznam s hodnotou „is_deleted“ nastavenou na 1. 
	 * Potom vygeneruje správu o úspešnosti a zavolá presmerovanie na referer. 
	 * 
	 * @param int $id
	 */
  function admin_delete($id = null) {
    //skontroluje, ci je nastavene id
    if ($id == NULL) 
      $this->redirect(array('admin' => false, 'controller' => 'calls', 'action' => 'index'));
    //pokusime sa nastavit is_deleted
		$call = array('Call' => array(
			'id' => $id,
			'is_deleted' => 1
		));  
    //pokusime ulozit vyzvu
    if ($this->Call->save($call))
      //pri uspesnom zmazani nastavime hlasku o uspesnoti
      $this->Session->setFlash(CALL_DELETED);
    else
      //pri neuspesnom zmazani nastavime hlasku o neuspesnosti
      $this->Session->setFlash(CALL_NOT_DELETED);
    
    //zavolame presmerovanie na listing userov
    $this->redirect(array('admin' => true, 'controller' => 'calls', 'action' => 'index'));
  }
		
}
?>